package util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class Util {

    private static SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

    public static final int CAMPO_DOUBLE = 1;
    public static final int CAMPO_TEXTO = 2;
    public static final int CAMPO_INT = 3;
    public static final int CAMPO_ARQUIVO = 4;
    
    public static String dateToString(Date data) {
        return dateFormat.format(data);
    }

    public static Date stringToDate(String data) throws ParseException {
        return dateFormat.parse(data);
    }
    /*
     * Pega o dia de uma data inserida em string no formato dd/MM/yyyy
     * retorna valores de 0 a 30
     * verifica se o dia é válido no mês/ano dado
     */

    public static int getDay(String data) throws ParseException {
        String[] str = data.split("/");
        if (str.length < 3) {
            throw new ParseException("Erro na conversão da data", 1);
        }
        int dia = Integer.parseInt(str[0]);
        int mes = Integer.parseInt(str[1]);
        int ano = Integer.parseInt(str[2]);
        if (dia > 31 || dia < 1) {
            throw new ParseException("Erro na conversão da data", 1);
        }
        if (new GregorianCalendar().isLeapYear(ano)) {
            if (mes == 2 && dia > 29) {
                throw new ParseException("Erro na conversão da data", 1);
            }
        } else if (mes == 2 && dia > 28) {
            throw new ParseException("Erro na conversão da data", 1);
        }
        if ((mes == 4 || mes == 6 || mes == 9 || mes == 11) && (dia > 30)) {
            throw new ParseException("Erro na conversão da data", 1);
        }
        return dia;
    }

    public static int getMonth(String data) throws ParseException {
        String[] str = data.split("/");
        if (str.length < 3) {
            throw new ParseException("Erro na conversão da data", 1);
        }
        int dia = Integer.parseInt(str[0]);
        int mes = Integer.parseInt(str[1]);
        int ano = Integer.parseInt(str[2]);
        if (mes > 12 || mes < 1) {
            throw new ParseException("Erro na conversão da data", 1);
        }
        return mes - 1;
    }

    public static int getYear(String data) throws ParseException {
        String[] str = data.split("/");
        if (str.length < 3) {
            throw new ParseException("Erro na conversão da data", 1);
        }
        int dia = Integer.parseInt(str[0]);
        int mes = Integer.parseInt(str[1]);
        int ano = Integer.parseInt(str[2]);
        if (ano < 1901 || ano > 2099) {
            throw new ParseException("Erro na conversão da data", 1);
        }
        return ano;
    }

    public static Date validaData(String data) throws ParseException {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.DAY_OF_MONTH, getDay(data));
        c.set(Calendar.MONTH, getMonth(data));
        c.set(Calendar.YEAR, getYear(data));
        return c.getTime();
    }

    public static boolean valida(int campo, String data) {
        if (data == null) {
            return false;
        }
        switch (campo) {
            case CAMPO_DOUBLE: {
                try {
                    double d = Double.parseDouble(data);
                } catch (NumberFormatException ex) {
                    return false;
                }
                break;
            }
            case CAMPO_INT: {
                try {
                    int i = Integer.parseInt(data);
                } catch (NumberFormatException ex) {
                    return true;
                }
                break;
            }
            case  CAMPO_TEXTO: {
                if (data.isEmpty()){
                    return true;
                }
                break;
            }
        }

        return false;
    }
    

    
}
